package fivm.cross.platform.ficommon.distinguish.droid;

import java.io.UnsupportedEncodingException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;

import com.fi.common.file.FileTool;
import com.fi.common.http.FiHttpRequest;
import com.fi.common.log.FiLog;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

import fivm.cross.platform.ficommon.HttpStandardMsg.HTTPPayloadResp;
import fivm.cross.platform.ficommon.distinguish.GsonSimpleSerializable;
import fivm.cross.platform.steamobj.base.FiBaseSerializableFromStream;
import fivm.cross.platform.steamobj.base.FiBaseSerializableToStream;
import fivm.cross.platform.steamobj.controller.CommandStream;


public class FiDroidSerializableFromStream extends FiBaseSerializableFromStream {
	public static <T> T fromJson(String json, Class<T> classOfT) {
		Gson gson=new GsonBuilder()
				.excludeFieldsWithoutExposeAnnotation() //不导出实体中没有用@Expose注解的属性
				.enableComplexMapKeySerialization() //支持Map的key为复杂对象的形式
				.serializeNulls()
				.setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")//时间转化为特定格式
				.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效.
				.setPrettyPrinting() //对json结果格式化.
				.setVersion(1.0)    //有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化.
				//@Since(版本号)能完美地实现这个功能.还的字段可能,随着版本的升级而删除,那么
				//@Until(版本号)也能实现这个功能,GsonBuilder.setVersion(double)方法需要调用.
				.create();
		return gson.fromJson(json,classOfT);
	}
	public static <T> T fromJson(String json, Type typeOfT) {
		Gson gson=new GsonBuilder()
				.excludeFieldsWithoutExposeAnnotation() //不导出实体中没有用@Expose注解的属性
				.enableComplexMapKeySerialization() //支持Map的key为复杂对象的形式
				.serializeNulls()
				.setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")//时间转化为特定格式
				.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效.
				.setPrettyPrinting() //对json结果格式化.
				.setVersion(1.0)    //有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化.
				//@Since(版本号)能完美地实现这个功能.还的字段可能,随着版本的升级而删除,那么
				//@Until(版本号)也能实现这个功能,GsonBuilder.setVersion(double)方法需要调用.
				.create();
		return gson.fromJson(json,typeOfT);
	}
	
	//该静态方法必须重写
	public static <T> T fromFile(String path,Class<T> classOfT){
		String cfgJson=FileTool.ReadTxtFile(path);
		return fromJson(cfgJson, classOfT);
	}
	public static <T> T fromHttp(String urlPath, Class<T> classOfT) {
		return null;
	}
	
	/**
	 * 发http包，不返回数据类
	 * */
	public static <T extends GsonSimpleSerializable> void toHttp(String urlPath,FiBaseSerializableToStream sendData){
		FiHttpRequest.sendGet(urlPath, sendData);
	}
	
	/**
	 * 发http包，并返回数据类
	 * */
	public static <T extends GsonSimpleSerializable> HTTPPayloadResp<T>  toHttp(String urlPath,FiBaseSerializableToStream sendData,Type typeOfT){
		String resp=FiHttpRequest.sendGet(urlPath, sendData);
		return HTTPPayloadResp.fromJson(resp, typeOfT);
	}
	/**
	 * 发http包，并返回数据类
	 * */
	public static <T extends GsonSimpleSerializable> HTTPPayloadResp<T> toHttp(String urlPath,HashMap mapParams,Type typeOfT) throws UnsupportedEncodingException {
		String resp=FiHttpRequest.sendGet(urlPath, mapParams);
		return HTTPPayloadResp.fromJson(resp, typeOfT);
	}
	
	
	
	public static  <T extends GsonSimpleSerializable> T toHttp(String urlPath,FiBaseSerializableToStream sendData,Class<T> classOfT){
		/**
		 * 重新构造这个泛型类型
		 * 这里的构造很有意思，我通过查找gson的构造type参数来达到要求
		 * */
		ParameterizedType parameterizedType=com.google.gson.internal.$Gson$Types.newParameterizedTypeWithOwner(null,
				HTTPPayloadResp.class,
				classOfT);
		//发包
		HTTPPayloadResp<T> responseContent=FiDroidSerializableFromStream.toHttp(urlPath, sendData,parameterizedType);
		if(responseContent==null){
			FiLog.appLogE(String.format("request url  %s error : response is null", urlPath));
			return null;
		}
		if(responseContent.isErrMsg()){
			FiLog.appLogE(String.format("request url  %s error ->msg : %s", urlPath,responseContent.get_header().getExtraMsg()));			
			return null;
		}
		return responseContent.get_payload();
	}
	
	public static  <T extends GsonSimpleSerializable> T toHttp(String urlPath,HashMap mapParams,Class<T> classOfT) throws UnsupportedEncodingException {
		
		ParameterizedType parameterizedType=com.google.gson.internal.$Gson$Types.newParameterizedTypeWithOwner(null,
				HTTPPayloadResp.class,
				classOfT);
		
		HTTPPayloadResp<T> responseContent= 
				FiDroidSerializableFromStream.toHttp(urlPath, mapParams,parameterizedType);
		if(responseContent==null){
			FiLog.appLogE(String.format("request url  %s error : response is null", urlPath));
			return null;
		}
		if(responseContent.isErrMsg()){
			FiLog.appLogE(String.format("request url  %s error ->msg : %s", urlPath,responseContent.get_header().getExtraMsg()));			
			return null;
		}
		return responseContent.get_payload();
	}
	
	
	
	
	
	
	
	
	
}
